package br.com.afi.web.util.tag;

import java.text.MessageFormat;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

import br.com.afi.util.log.Logger;

/**
 * Essa tag deve ser utilizada em conjunto com {@link ELInvokeMethodTag}. Sua função é especificar
 * os attributos do método informado na tag {@link ELInvokeMethodTag}. Portanto a tag
 * {@link ELInvokeMethodTag} pode conter uma ou mais tag deste tipo.
 * 
 * @author André de Fontana Ignacio
 * @version 1.0
 */
public class ELParameterMethodTag extends TagSupport
{
	private static final long serialVersionUID = 1L;
	private static final Logger log = Logger.getLogger( ELParameterMethodTag.class );
	/**
	 * Nome da Classe do atributo do método.
	 */
	private String className;
	/**
	 * Valor do atributo do método.
	 */
	private Object value;

	/**
	 * Construtor
	 */
	public ELParameterMethodTag()
	{
		super();
	}

	@Override
	public int doStartTag() throws JspException
	{
		final Object parent = this.getParent();
		if ( parent instanceof ELInvokeMethodTag )
		{
			final ELInvokeMethodTag invokeMethodTag = ( ELInvokeMethodTag ) parent;
			try
			{
				final Class<?> clazz = Class.forName( className );
				invokeMethodTag.addParameter( clazz, value );
			}
			catch ( ClassNotFoundException e )
			{
				final JspException ex = new JspException( MessageFormat.format( "Classe {0} não encontrada", className ), e );
				log.error( ex.getMessage(), e );
				throw ex;
			}
		}
		else
		{
			final JspException ex = new JspException( "A tag parameter deve ser utilizada dentro da tag invokeMethod." );
			log.error( ex.getMessage() );
			throw ex;
		}

		return super.doStartTag();
	}

	public String getClassName()
	{
		return className;
	}

	public void setClassName( String className )
	{
		this.className = className;
	}

	public Object getValue()
	{
		return value;
	}

	public void setValue( Object value )
	{
		this.value = value;
	}
}
